/*
 * 冰淇淋机控制模块头文件
 * 定义控制模块的所有接口函数、数据结构和宏定义
 */
#ifndef ICE_CREAM_CONTROL_H
#define ICE_CREAM_CONTROL_H

#include "io_driver.h"
#include "sys_pub.h"

// 顶料类型枚举
typedef enum {
    TOPPING_NONE = 0,  // 无顶料
    TOPPING_1,         // 顶料1（如坚果碎）
    TOPPING_2,         // 顶料2（如巧克力碎）
    TOPPING_3          // 顶料3（如饼干碎）
} ToppingType;

// 果酱类型枚举
typedef enum {
    JAM_NONE = 0,      // 无果酱
    JAM_1,             // 果酱1（如草莓酱）
    JAM_2,             // 果酱2（如蓝莓酱）
    JAM_3              // 果酱3（如巧克力酱）
} JamType;


/**
 * @brief 初始化冰淇淋控制模块
 * @details 初始化所有轴状态、执行器状态和系统变量，
 *          必须在使用其他任何控制函数之前调用
 */
void ice_cream_control_init(void);


/**
 * @brief 冰淇淋控制模块周期性处理函数
 * @details 在主循环中调用，处理所有非阻塞任务：
 *          - 步进电机运动控制
 *          - 原点回归流程
 *          - 执行器定时状态检查
 *          调用周期建议不超过10ms
 */
void ice_cream_control_process(void);

/**
 * @brief 控制顶料1的输出
 * @param state 控制状态：1=开启，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_topping(uint8_t topping_id,uint8_t state);

/**
 * @brief 控制果酱1的输出
 * @param state 控制状态：1=开启，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_jam(uint8_t jam_id,uint8_t state);



/**
 * @brief 控制落杯电机
 * @param state 控制状态：1=启动出杯，0=停止
 */
void control_cup_drop_motor(uint8_t state);

/**
 * @brief 控制膨化泵
 * @param state 控制状态：1=启动，0=停止
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_expansion_pump(uint8_t state);

/**
 * @brief 控制主压机
 * @param state 控制状态：1=启动，0=停止
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_main_press(uint8_t state);

/**
 * @brief 控制主电机，出奶浆一定可控制主电机挤奶浆控制
 * @param state 控制状态：1=启动，0=停止
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_main_motor(uint8_t state);

/**
 * @brief 控制预冷电磁阀
 * @param state 控制状态：1=打开，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_precool_solenoid(uint8_t state);

/**
 * @brief 控制制冷电磁阀
 * @param state 控制状态：1=打开，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_refrigeration_solenoid(uint8_t state);

/**
 * @brief 控制制热电磁阀
 * @param state 控制状态：1=打开，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示表示持续持续运行直到手动关闭
 */
void control_heating_solenoid(uint8_t state);

/**
 * @brief 控制杀菌灯
 * @param state 控制状态：1=开启，0=关闭
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_sterilizing_lamp(uint8_t state);

/**
 * @brief 控制奶浆出料口开,提升电机上升
 * @param state 控制状态：1=上升，0=停止
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_lifting_motor_up(uint8_t state);

/**
 * @brief 控制奶浆出料口关,提升电机下降
 * @param state 控制状态：1=下降，0=停止
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_lifting_motor_down(uint8_t state);
/**
 * @brief 控制门电机
 * @param state 控制状态：1=开门，0=关门
 * @param duration_ms 持续时间（毫秒），0表示持续运行直到手动关闭
 */
void control_door_motor(uint8_t state);

/**
 * @brief 启动X轴步进电机运动
 * @param dir 运动方向：1=正方向，0=反方向
 * @param steps 运动步数
 * @param step_delay 步间延时（微秒）
 * @return 启动成功返回true，失败（如正在运动）返回false
 */
bool start_x_axis_movement(int dir, uint32_t steps);

/**
 * @brief 启动Z轴步进电机运动
 * @param dir 运动方向：1=正方向，0=反方向
 * @param steps 运动步数
 * @param step_delay 步间延时（微秒）
 * @return 启动成功返回true，失败（如正在运动）返回false
 */
bool start_z_axis_movement(int dir, uint32_t steps);
bool start_z_axis_moveto(uint32_t target_pos) ;
bool start_x_axis_moveto(uint32_t target_pos) ;
/**
 * @brief 检查X轴是否正在运动
 * @return 正在运动返回true，否则返回false
 */
bool is_x_axis_moving(void);

/**
 * @brief 检查Z轴是否正在运动
 * @return 正在运动返回true，否则返回false
 */
bool is_z_axis_moving(void);



/**
 * @brief 启动X轴原点回归
 * @return 启动成功返回true，失败（如正在回归）返回false
 */
bool start_x_axis_homing(void);

/**
 * @brief 启动Z轴原点回归
 * @return 启动成功返回true，失败（如正在回归）返回false
 */
bool start_z_axis_homing(void);

/**
 * @brief 获取X轴原点回归状态
 * @return 0=未开始，1=正在回归，2=完成，3=失败
 */
uint8_t get_x_axis_homing_state(void);

/**
 * @brief 获取Z轴原点回归状态
 * @return 0=未开始，1=正在回归，2=完成，3=失败
 */
uint8_t get_z_axis_homing_state(void);

/**
 * @brief 读取X轴原点传感器状态
 * @return 1=检测到原点，0=未检测到
 */
uint8_t read_x_axis_origin(void);

/**
 * @brief 读取Z轴原点传感器状态
 * @return 1=检测到原点，0=未检测到
 */
uint8_t read_z_axis_origin(void);

/**
 * @brief 读取落杯位置传感器状态
 * @return 1=杯子到位，0=未到位
 */
uint8_t read_cup_drop_pos_1(void);

/**
 * @brief 读取杯子检测传感器状态
 * @return 1=检测到杯子，0=未检测到
 */
uint8_t read_cup_detection(void);

/**
 * @brief 读取原料欠料传感器状态
 * @return 1=欠料，0=料位正常
 */
uint8_t read_float_material_low(void);

/**
 * @brief 读取对射传感器状态
 * @return 1=被遮挡，0=无遮挡
 */
uint8_t read_photoelectric_signal(void);

/**
 * @brief 读取夹手开关状态
 * @return 1=开关闭合，0=开关断开
 */
uint8_t read_gripper_switch(void);

/**
 * @brief 获取X轴当前位置
 * @return X轴相对原点的位置（脉冲数）
 */
int32_t get_x_axis_position(void);

/**
 * @brief 获取Z轴当前位置
 * @return Z轴相对原点的位置（脉冲数）
 */
int32_t get_z_axis_position(void);

/**
 * @brief 设置X轴位置（用于校准）
 * @param pos 要设置的位置值（脉冲数）
 */
void set_x_axis_position(int32_t pos);

/**
 * @brief 设置Z轴位置（用于校准）
 * @param pos 要设置的位置值（脉冲数）
 */
void set_z_axis_position(int32_t pos);



#endif // ICE_CREAM_CONTROL_H
